Hyrje ne SQL
SQL vjen nga termat Structured Query Language. Ajo na jep mundesine qe te punojme me bazen e te dhenave. Duke perdorur ate ne mund shtojme, te modifikojme ose te fshijme rekorde nga baza e te dhenave. Mund te shtojme tabela te reja brenda nje databaze, mund te shtojme nje databaze te re ose mund t'i fshijme ato. Per te ekzekutuar SQL-ne na duhet nje sistem per menaxhimin e bazave te te dhenave sic eshte p.sh. MySQL. SQL-ja eshte shume e rendesishme per programuesit te cilet duan te zhvillojne faqe dinamike dhe aplikacione te zgjeruara. Ne shume momente do te na duhet te marrim rekorde nga baza e te dhenave dhe ti shfaqim ato ne faqen ose aplikacionin tone, do te na duhet te shtojme rekorde te reja nepermjet aplikacionit, te modifikojme ose te fshijme rekorde.
Pergjithesisht, nje deklarate SQL nis me nje term qe thekson se cfare do te beje (p.sh. SELECT), me pas thekson se mbi cilin objekt te kryeje veprimin (p.sh. duke perdorur FROM)
SELECT * FROM lexuesit;
Gjithashtu mund te kete nje kusht te vendosur ne fund te deklarates (p.sh. termi WHERE).
SELECT * FROM lexuesit
WHERE emri = 'Alban';
SQL-ja nuk eshte case-sensitive, dmth. nuk ka rendesi nese shkronjat shkruhen kapitale ose jo. Per lehtesi kuptimi shume programues perdorin germat kapitale per komandat e SQL-se dhe germa te vogla per termat e tjere. Nuk ka rendesi sesa hapesire leme ndermjet komandave te SQL-se. P.sh. deklarata e mesiperme mund te shkruhet edhe ne nje rresht te vetem:
SELECT * FROM lexuesit WHERE emri = 'Alban';
Ne fund te cdo deklarate SQL duhet te vendoset nje pikepresje ;
. Ne disa raste mund te lejohet edhe pa pikepresje por eshte praktike e duhur qe mos te harrohet pikepresja ne fund te cdo deklarate SQL.
Shembujt qe do te paraqesim ne vijim te ketij seksioni do te jene te bazuara mbi deklaratat qe ekzekutohen ne nje sistem te menaxhimit te te dhenave si MySQL. Ka raste qe disa deklarata varen nga lloji i sistemit, per kete arsye e bej te qarte qe deklaratat e meposhtme pershtaten me sistemin MySQL.
DML & DDL
Data Manipulation Language (DML) - Gjuha per manipulimin e te dhenave
DML na lejon qe te punojme me te dhenat qe gjenden ne databazen tone. DML perdoret per te shtuar, modifikuar, fshire ose per te marre rekorde nga databaza. Shumica e deklaratave SQL qe do te bejme do te filloje me njerin nga termat e meposhtem:
- SELECT - Merr te dhena nga databaza
- INSERT - Shton te dhena ne databaze
- UPDATE - Modifikon te dhena ekzistuese ne databaze
- DELETE - Fshin te dhena ekzistuese nga databaza
Data Definition Language (DDL) - Gjuha per definimin (organizimin) e te dhenave
Duke perdorur DDL ne mund te krijojme nje tabel te re, mund te fshijme ose modifikojme nje te tille.
Shembuj te komandave DDL:
- CREATE DATABASE - Krijon nje databaze te re
- ALTER DATABASE - Modifikon nje databaze
- DROP DATABASE - Fshin nje databaze
- CREATE TABLE - Krijon nje tabele te re
- ALTER TABLE - Modifikon nje tabele
- DROP TABLE - Fshin nje tabele
SELECT
Deklarata SELECT
eshte me e perdorura ne SQL. Ajo thjesht merr te dhena nga databaza.
Shembull:
SELECT * FROM lexuesit;
Me ane te deklarates se mesiperme kerkojme te marrim te gjitha (*
) kolonat e tabeles se quajtur lexuesit
. Perdorimi i asterisk (*
) pas termit SELECT
percakton qe deshirojme te gjitha kolonat. Pas ekzekutimit te SQL-se se mesiperme te dhenat e marra do te jene te gjithe rreshtat e tabeles lexusit
:
Komanda:
SELECT * FROM lexuesit;
id | emri | adresa | celular |
---|---|---|---|
1 | Alban Afmeti | Qyteti Studenti, Tirane | 0664064062 |
2 | Drilon Kerxhaliu | Ali Demi, Tirane | 0662017293 |
3 | Brilant Afmeti | Rruga Kavajes, Tirane | 0662583993 |
Per te mos shfaqur te gjitha kolonat por vetem nje pjese te tyre, pas termit SELECT
specifikojme emrat e fushave te ndara me presje:
SELECT emri, celular FROM lexuesit;
Komanda:
SELECT emri, celular FROM lexuesit;
emri | celular |
---|---|
Alban Afmeti | 0664064062 |
Drilon Kerxhaliu | 0662017293 |
Brilant Afmeti | 0662583993 |
Shohim qe do te na kthehen vetem te dhenat qe jemi te interesuar, pra emri dhe celulari i lexuesit. Ne shume raste emrave te fushave u vendoset perpara emri tabeles shoqeruar me nje pike .
:
SELECT lexuesit.emri, lexuesit.celular FROM lexuesit;
Kjo behet per arsye se mund te zgjedhim fusha nga dy tabela te ndryshme (do te trajtohet me poshte), dhe duhet te specifikojme se kujt tabele i perket fusha.
Ne shume raste nuk jemi te interesuar per te gjitha rreshtat e tabeles, por vetem per ato rreshta qe plotesojne nje kusht te caktuar. Per te filtruar vetem rreshtat qe duam perdorim termin WHERE
i cili na sherben per te vendosur kushte te ndryshme. Termi WHERE
vendoset ne fund te deklarates.
SELECT emri, celular FROM lexuesit WHERE celular = '0664064062';
Komanda:
SELECT emri, celular FROM lexuesit WHERE celular = '0664064062';
emri | celular |
---|---|
Alban Afmeti | 0664064062 |
Me lart kemi perzgjedhur vetem rekordet qe e kane fushen celular
te barabarte me 0664064062
. Ne kete rast na u kthye vetem nje rekord.
Ne deklaratat SQL per krahasimin e stringave ne vend te operatorit =
mund te perdorim operatorin LIKE
si ne rastin e meposhtem:
SELECT emri, celular FROM lexuesit WHERE celular LIKE '0664064062';
Ka te njejtin funksion si operatori =
, por ne kete rast ne stringen e kushtit WHERE
mund te perdorim simbolin %
si me poshte:
SELECT emri, celular FROM lexuesit WHERE celular LIKE '066%';
Ne kete rast mjafton qe numri te nise me 066
dhe pjesa tjeter te jete si te doje. Kjo vjen per shkak te perdorimit te simbolit %
ne perfundim te stringes. Ky simbol mund te perdoret ne cdo pozicion te stringes dhe nenkupton nje numer karakteresh zero ose me shume.
Ne mund te filtrojme rekordet e nje tabele duke vene me shume se nje kusht me ane te operatoreve te ndryshem. Dy oepratoret me te perdorur jane operatoret AND
dhe OR
.
Operatori AND
Operatori AND
filtron te gjitha rekordet qe plotesojne kushtin e pare dhe kushtin e dyte.
SELECT emri, celular FROM lexuesit WHERE celular = '0664064062' AND emri = 'Drilon Kerxhaliu';
Ne rast se kemi me shume se dy kushte te lidhura me AND
, atehere duhet te plotesohen te treja kushtet.
Komanda:
SELECT emri, celular FROM lexuesit WHERE celular = '0664064062' AND emri = 'Drilon Kerxhaliu';
emri | celular |
---|---|
Drilon Kerxhaliu | 0662017293 |
Operatori OR
Operatori OR
filtron te gjitha rekordet qe plotesojne te pakten njerin nga kushtet, pra nje ose me shume kushte te plotesuara.
SELECT emri, celular FROM lexuesit WHERE emri = 'Alban Afmeti' OR emri = 'Drilon Kerxhaliu';
Komanda:
SELECT emri, celular FROM lexuesit WHERE emri = 'Alban Afmeti' OR emri = 'Drilon Kerxhaliu';
emri | celular |
---|---|
Alban Afmeti | 0664064062 |
Drilon Kerxhaliu | 0662017293 |
IN
Operatori IN
na lejon te vendosim vlera te shumefishta ne deklaraten WHERE
:
SELECT * FROM lexuesit WHERE emri IN ('Alban Afmeti', 'Drilon Kerxhaliu');
Komanda:
SELECT * FROM lexuesit WHERE emri IN ('Alban Afmeti', 'Drilon Kerxhaliu');
id | emri | adresa | celular |
---|---|---|---|
1 | Alban Afmeti | Qyteti Studenti, Tirane | 0664064062 |
2 | Drilon Kerxhaliu | Ali Demi, Tirane | 0662017293 |
ORDER BY
Duke perdorur deklaratat SELECT
ne tabela te ndryshme mund te na kthehen qindra rekorde. Ne disa raste eshte e nevojshme qe keto rekorde ti radhisim bazuar sipas nje fushe. P.sh. rekordet qe marrim nga tabela lexuesit
mund ti radhisim sipas emrit:
SELECT * FROM lexuesit ORDER BY emri;
Komanda:
SELECT * FROM lexuesit ORDER BY emri;
id | emri | adresa | celular |
---|---|---|---|
1 | Alban Afmeti | Qyteti Studenti, Tirane | 0664064062 |
3 | Brilant Afmeti | Rruga Kavajes, Tirane | 0662583993 |
2 | Drilon Kerxhaliu | Ali Demi, Tirane | 0662017293 |
Shohim qe pavaresisht se lexuesi Brilant Afmeti
ka id te barabarte me 3 ai renditet i dyti. Kjo ndodh pasi kemi vendosur ti radhisim sipas emrit alfabetikisht. Ne kete rast radhitja eshte ne ngjitje (ascending - ASC) sepse kjo eshte vendosur default nga sistemi i menaxhimit te bazes se te dhenave. Por ne mund ta ndryshojme kete dhe ta bejme qe radhitja te jete ne zbritje (descending - DESC). Mjafton te shtojme termin DESC
pas fushes qe behet radhitja.
SELECT * FROM lexuesit ORDER BY emri DESC;
Komanda:
SELECT * FROM lexuesit ORDER BY emri DESC;
id | emri | adresa | celular |
---|---|---|---|
2 | Drilon Kerxhaliu | Ali Demi, Tirane | 0662017293 |
3 | Brilant Afmeti | Rruga Kavajes, Tirane | 0662583993 |
1 | Alban Afmeti | Qyteti Studenti, Tirane | 0664064062 |
LIMIT
Ka raste kur nje deklarate SQL qe mund te ekzekutojme mund te na ktheje qindra rekorde. Ne mund te jemi te interesuar te marrim vetem 10 rekorde pavaresisht se kushtin WHERE
qe ne kemi percaktuar mund ta plotesojne 100 rekorde. Per te marre vetem numrin e rekordeve qe ne duam perdoret termi LIMIT
. Ky term percakton numrin e rekordeve maksimal qe nje deklarate SQL duam qe te na ktheje.
Ajo cfare ne te vertete ndodh:
- Behet nje
SELECT
per te gjitha rekordet qe plotesojne kushtinWHERE
- Radhiten rekordet sipas fushes qe kemi percaktuar ne
ORDER BY
, ose nqs. nuk kemi percaktuar asgje, radhiten sipas nje fushedefault
te percaktuar nga baza e te dhenave, zakonisht fusha qe eshtePRIMARY KEY
- Pas radhitjes, kthehet vetem numri i rekordeve qe kemi percaktuar tek termi
LIMIT
duke ju bazuar radhitjes. Pra, merren rekordet duke filluar nga rekordi i pare pas radhitjes.
Shembull:
SELECT * FROM lexuesit ORDER BY emri DESC LIMIT 2;
Komanda:
SELECT * FROM lexuesit ORDER BY emri DESC LIMIT 2;
id | emri | adresa | celular |
---|---|---|---|
2 | Drilon Kerxhaliu | Ali Demi, Tirane | 0662017293 |
3 | Brilant Afmeti | Rruga Kavajes, Tirane | 0662583993 |
Pavaresisht se kushtin e plotesojne 3 rekorde, jane marre vetem 2 te tilla per shkak te limitit qe kemi vendosur. Ne rast se radhitja do te ishte ASC
atehere do te ishin rekorde te tjera. Ne deklaraten SQL eshte opsionale vendosja e radhitjes ASC
, pasi eshte default.
Komanda:
SELECT * FROM lexuesit ORDER BY emri ASC LIMIT 2;
id | emri | adresa | celular |
---|---|---|---|
1 | Alban Afmeti | Qyteti Studenti, Tirane | 0664064062 |
3 | Brilant Afmeti | Rruga Kavajes, Tirane | 0662583993 |
OFFSET
Nese vendosim nje limit, merren rekordet duke filluar nga rekordi i pare pas radhitjes. Po sikur te duam qe te merren rekordet duke filluar nga rekordi i dyte, i trete etj.? Na vjen ne ndihme termi OFFSET
. Ajo cfare ndodh eshte qe pas radhitjes se rekordeve, tejkalohen aq rekorde sa jane percaktuar tek OFFSET
dhe me pas fillon marrja e tyre. P.sh. nqs percaktojme OFFSET 1
, rekordi i pare tejkalohet dhe fillon marrja tek rekordi i dyte.
Termi OFFSET
duhet gjithmone te para shoqerohet me termin LIMIT
. Le te paraqesim nje deklarate normale pa LIMIT
dhe OFFSET
:
Komanda:
SELECT * FROM lexuesit ORDER BY emri;
id | emri | adresa | celular |
---|---|---|---|
1 | Alban Afmeti | Qyteti Studenti, Tirane | 0664064062 |
3 | Brilant Afmeti | Rruga Kavajes, Tirane | 0662583993 |
2 | Drilon Kerxhaliu | Ali Demi, Tirane | 0662017293 |
Le te shtojme LIMIT 2
dhe OFFSET 2
:
Komanda:
SELECT * FROM lexuesit ORDER BY emri LIMIT 2 OFFSET 1;
id | emri | adresa | celular |
---|---|---|---|
3 | Brilant Afmeti | Rruga Kavajes, Tirane | 0662583993 |
2 | Drilon Kerxhaliu | Ali Demi, Tirane | 0662017293 |
Shohim qe eshte tejkaluar rekordi i pare me id = 1
, fillon numerimi nga rekordi i dyte dhe merren dy rekordet e radhes meqe eshte percaktuar LIMIT 2
.
Alias-et
Kur emri i nje tabele eshte shume i gjate, ne mund te perdorim nje alias, qe eshte nje emer i dyte qe ne i vendosim tabeles per ta perdorur ne deklaratat SQL qe po ndertojme.
SELECT * FROM lexuesit AS lex;
ose
SELECT lex.emri, lex.adresa FROM lexuesit AS lex;
JOINS
Per te marre te dhena nga dy tabela te ndryshme perdoren deklaratat SQL me bashkimet JOIN
. Ne seksionin qe shpjeguam se cfare jane databazat relacionale paraqitem dy tabela lexuesit
dhe librat
te cilat i riparaqesim te lidhura me relacion One-to-many
:
Tabela:
lexuesit
id | emri | adresa | celular |
---|---|---|---|
1 | Alban Afmeti | Qyteti Studenti, Tirane | 0664064062 |
2 | Drilon Kerxhaliu | Ali Demi, Tirane | 0662017293 |
3 | Brilant Afmeti | Rruga Kavajes, Tirane | 0662583993 |
4 | Arber Lami | Rruga Dibres, Tirane | 0662583777 |
Tabela:
librat
id | libri | data_kthimit | id_lexues |
---|---|---|---|
1 | "Advanced PHP" | 2017-05-01 | 1 |
2 | "Web Programming" | 2017-06-02 | 2 |
3 | "PHP Performance" | 2017-05-12 | 1 |
4 | "Social Life" | 2017-06-12 | 3 |
5 | "PHP Cookbook" | 2017-06-03 | 1 |
6 | "Advanced SQL" | 2017-06-12 | 1 |
Nje lexues
mund te kete marre zero ose me shume libra. Ne tabelen librat
fusha id_lexues
percakton se cili lexues ka marre librin ne fjale.
Do te trajtojme dy tipe te deklaratave JOIN
:
INNER JOIN
- Kthen nje liste me rekorde te cilat nje rekord ne tabelen e pare ka te pakten nje korrespondues ne tabelen e dyte dhe anasjelltas. Ne rast se nje rekord ne tabelen e pare nuk ka korrespondues ne tabelen e dyte ai nuk kthehet. Po ashtu, ne rast se nje rekord ne tabelen e dyte nuk ka korrespondues me ndonje rekord ne tabelen e pare ai nuk kthehet.
SELECT * FROM lexuesit
INNER JOIN librat
ON lexuesit.id = librat.id_lexues;
Ekziston nje kusht ne bashkimet JOIN
te cilat i lidh tabelat ndermjet tyre, gjen korrespondencen ndermjet rekordeve. Ky kusht vjen pas termit ON
: ON lexuesit.id = librat.id_lexues
. Pra, behet nje bashkim i rekordeve qe plotesojne kushtin qe id-ja e lexuesit te jete e barabarte me celesin e jashtem id_lexues
te tabeles librat
. Ne kete rast rekordet qe do te na kthehen do te jene:
id | emri | adresa | celular | id | libri | data_kthimit | id_lexues |
---|---|---|---|---|---|---|---|
1 | Alban Afmeti | Qyteti Studenti, Tirane | 0664064062 | 1 | "Advanced PHP" | 2017-05-01 | 1 |
1 | Alban Afmeti | Qyteti Studenti, Tirane | 0664064062 | 3 | "PHP Performance" | 2017-05-12 | 1 |
1 | Alban Afmeti | Qyteti Studenti, Tirane | 0664064062 | 5 | "PHP Cookbook" | 2017-06-03 | 1 |
1 | Alban Afmeti | Qyteti Studenti, Tirane | 0664064062 | 6 | "Advanced SQL" | 2017-06-12 | 1 |
2 | Drilon Kerxhaliu | Ali Demi, Tirane | 0662017293 | 2 | "Web Programming" | 2017-06-02 | 2 |
3 | Brilant Afmeti | Rruga Kavajes, Tirane | 0662583993 | 4 | "Social Life" | 2017-06-12 | 3 |
Dukeqenese kemi bere nje INNER JOIN
, rekordi i lexuesit Arber Lami
nuk eshte shfaqur ne liste sepse ai nuk ka korrespondent ne tabelen librat
.
Ne kete moment rekordet e kthyera jane thjeshte pergjigja qe na jep SQL-ja, dhe nuk duhet menduar si perseritje te dhenash. Te dhenat ne memorie ruhen te paperseritura, por eshte SQL-ja ajo qe na i paraqet ne forme te zgjeruar ne momentin qe ne ekzekutojme deklarata te tilla.
Shohim qe na jane shfaqur kolonat e dy tabelave sebashku. Pra fushat id
, emri
, adresa
, celular
e tabeles lexuesit
dhe fushat id
, libri
, data_kthimit
, id_lexues
e tabeles librat
. Duke qene se kemi dy fusha me emer te njejte id
, shpeshhere kjo na jep problem ne momentin qe i referohemi fushave, pasi nuk eshte e qarte nese po i referohemi fushes se pare id
apo fushes tjeter. Per kete arsye ne deklaratat SQL duhet te specifikojme se cilat fusha te kthehen pas ekzekutimit:
SELECT lex.id, lex.emri, lib.libri, lib.data_kthimit FROM lexuesit AS lex
INNER JOIN librat AS lib
ON lexuesit.id = librat.id_lexues;
Ne deklaraten e mesiperme kemi perdorur konceptin e alias-eve per te shkurtuar emrin e tabelave ne menyre qe kur te perzgjedhim fushat qe do te na kthehen, t'a kemi me te lehte. Ne kete rast kam perzgjedhur fushat id
dhe emri
te tabeles lexuesit
, pra lex.id, lex.emri
dhe fusha libri
dhe data_kthimit
per tabelen librat
, pra lib.libri, lib.data_kthimit
.
Rezultati qe do te na kthehet pas ekzekutimit te deklarates:
id | emri | libri | data_kthimit |
---|---|---|---|
1 | Alban Afmeti | "Advanced PHP" | 2017-05-01 |
1 | Alban Afmeti | "PHP Performance" | 2017-05-12 |
1 | Alban Afmeti | "PHP Cookbook" | 2017-06-03 |
1 | Alban Afmeti | "Advanced SQL" | 2017-06-12 |
2 | Drilon Kerxhaliu | "Web Programming" | 2017-06-02 |
3 | Brilant Afmeti | "Social Life" | 2017-06-12 |
LEFT JOIN
- Kthen nje liste me rekorde te tabeles se pare, duke i bashkangjitur ne krah korresponduesit qe kane ne tabelen e dyte. Edhe ne rast se nje rekord ne tabelen e pare nuk ka korrespondues ne tabelen e dyte ai do te listohet.
SELECT * FROM lexuesit
LEFT JOIN librat
ON lexuesit.id = librat.id_lexues;
Rezultati i kthyer:
id | emri | adresa | celular | id | libri | data_kthimit | id_lexues |
---|---|---|---|---|---|---|---|
1 | Alban Afmeti | Qyteti Studenti, Tirane | 0664064062 | 1 | "Advanced PHP" | 2017-05-01 | 1 |
2 | Drilon Kerxhaliu | Ali Demi, Tirane | 0662017293 | 2 | "Web Programming" | 2017-06-02 | 2 |
1 | Alban Afmeti | Qyteti Studenti, Tirane | 0664064062 | 3 | "PHP Performance" | 2017-05-12 | 1 |
3 | Brilant Afmeti | Rruga Kavajes, Tirane | 0662583993 | 4 | "Social Life" | 2017-06-12 | 3 |
1 | Alban Afmeti | Qyteti Studenti, Tirane | 0664064062 | 5 | "PHP Cookbook" | 2017-06-03 | 1 |
1 | Alban Afmeti | Qyteti Studenti, Tirane | 0664064062 | 6 | "Advanced SQL" | 2017-06-12 | 1 |
4 | Arber Lami | Rruga Dibres, Tirane | 0662583777 | (NULL) | (NULL) | (NULL) | (NULL) |
Te gjitha kolonat e te dyja tabelave bashkohen ne varesi te korrespondences qe kane, pra id
e tabeles lexuesit
te jete e barabarte me id_lexues
te tabeles librat
, sepse ky eshte edhe kushti i bashkimit ON lexuesit.id = librat.id_lexues;
. Arsyeja e listimit te te gjitha kolonave eshte sepse ne deklarate kemi perdorur asterisk SELECT *
.
Ne kete rast edhe pse rekordi me lexuesin Arber Lami
nuk ka korrespondent ne tabelen librat
, ai shfaqet i listuar. Dukeqenese nuk ka korrespondet ne tabelen e dyte, fushat e tabeles se dyte qe ju bashkangjiten te pares marrin vleren NULL
per kete rekord.
INSERT
Deklaratat INSERT
sherbejne per te shtuar te dhena ne bazen e te dhenave. Me ane te komandes INSERT
mund te shtojme nje rekord te ri ne nje tabele te databazes.
INSERT INTO lexuesit
VALUES ( '5', 'Leart Gjoni', 'Brryli, Tirane', '0664435948' );
Pasi te ekzekutohet komanda e mesiperme ne tabele do te shtohet nje rekord i ri. Ekzekutojme komanden SELECT
per te pare rekordet e tabeles:
Komanda:
SELECT * FROM lexuesit;
id | emri | adresa | celular |
---|---|---|---|
1 | Alban Afmeti | Qyteti Studenti, Tirane | 0664064062 |
2 | Drilon Kerxhaliu | Ali Demi, Tirane | 0662017293 |
3 | Brilant Afmeti | Rruga Kavajes, Tirane | 0662583993 |
4 | Arber Lami | Rruga Dibres, Tirane | 0662583777 |
5 | Leart Gjoni | Brryli, Tirane | 0664435948 |
Ne rastin e mesiperm pas termit VALUES
ne specifikuam te gjitha vlerat qe do te kene fushat per rekordin e ri ( '5', 'Leart Gjoni', 'Brryli, Tirane', '0664435948' )
respektivisht id
, emri
, adresa
, celular
.
Ne disa raste mund te duam qe te specifikojm vetem nje pjese te vlerave per disa fusha specifike:
INSERT INTO lexuesit (emri, adresa)
VALUES ( 'Gentjan Afmeti', 'Blloku, Tirane' );
Ne kete rast vlerat e specifikuara nga ne 'Gentjan Afmeti', 'Blloku, Tirane'
do ti kalohen respektivisht fushave emri, adresa
te deklaruara brenda kllapave qe vijne pas emrit te tabeles. Le te shohim rekordin e shtuar:
Komanda:
SELECT * FROM lexuesit;
id | emri | adresa | celular |
---|---|---|---|
1 | Alban Afmeti | Qyteti Studenti, Tirane | 0664064062 |
2 | Drilon Kerxhaliu | Ali Demi, Tirane | 0662017293 |
3 | Brilant Afmeti | Rruga Kavajes, Tirane | 0662583993 |
4 | Arber Lami | Rruga Dibres, Tirane | 0662583777 |
5 | Leart Gjoni | Brryli, Tirane | 0664435948 |
6 | Gentjan Afmeti | Blloku, Tirane | (NULL) |
Shohim qe fusha id
eshte gjeneruar automatikisht me vleren 6
. Kjo ndodh kur nje PRIMARY KEY
sic eshte id
ne kete rast e vendosim me opsionin AUTOINCREMENT
. Dukeqenese id
duhet te jete unike, opsioni AUTOINCREMENT
gjeneron nje numer unik ne fushen id
per rekordin ne fjale, duke inkrementuar pas cdo shtimi te nje rekordi te ri. Meqenese nuk percaktuam nje vlere per fushen celular
, ajo do te marre vleren NULL
.
Komanda INSERT
perdoret vetem kur duam te shtojme rekorde te reja ne nje tabele. Per modifikime te nje rekordi ekzistues duhet te perdorim komanden UPDATE
.
UPDATE
Deklaratat UPDATE
sherbejne per te modifikuar te dhena ekzistuese ne bazen e te dhenave. Me ane te komandes UPDATE
mund te modifikojme rekorde ekzistuese ne nje tabele te databazes. Kjo komande perdor kushtin WHERE
per te percaktuar kushtin se cilat rekorde do te modifikohen. Ne rast se nuk percaktojme nje kusht WHERE
do te modifikohen te gjitha rekordet.
UPDATE lexuesit
SET celular = '0662222222'
WHERE id = 1;
Pasi te ekzekutohet komanda e mesiperme ne tabele do te modifikohet rekordi qe e ka id-ne te barabarte me 1
. Ekzekutojme komanden SELECT
per te pare te dhenat e ndryshuara:
Komanda:
SELECT * FROM lexuesit;
id | emri | adresa | celular |
---|---|---|---|
1 | Alban Afmeti | Qyteti Studenti, Tirane | 0662222222 |
2 | Drilon Kerxhaliu | Ali Demi, Tirane | 0662017293 |
3 | Brilant Afmeti | Rruga Kavajes, Tirane | 0662583993 |
4 | Arber Lami | Rruga Dibres, Tirane | 0662583777 |
5 | Leart Gjoni | Brryli, Tirane | 0664435948 |
6 | Gentjan Afmeti | Blloku, Tirane | (NULL) |
Modifikimi eshte kryer me sukses. Fusha celular
per rekordin me id = 1
eshte ndryshuar ne 0662222222
.
Mund te modifikojme edhe disa fusha njeheresh, mjafton qe ti ndajme fushat me presje ,
.
UPDATE lexuesit
SET adresa = 'Nentkateshet, Tirane', celular = '0663333333'
WHERE id = 6;
Pasi te ekzekutohet komanda e mesiperme ne tabele do te modifikohet rekordi qe e ka id-ne te barabarte me 6
.
Ekzekutojme komanden SELECT
per te pare te dhenat e ndryshuara:
Komanda:
SELECT * FROM lexuesit;
id | emri | adresa | celular |
---|---|---|---|
1 | Alban Afmeti | Qyteti Studenti, Tirane | 0662222222 |
2 | Drilon Kerxhaliu | Ali Demi, Tirane | 0662017293 |
3 | Brilant Afmeti | Rruga Kavajes, Tirane | 0662583993 |
4 | Arber Lami | Rruga Dibres, Tirane | 0662583777 |
5 | Leart Gjoni | Brryli, Tirane | 0664435948 |
6 | Gentjan Afmeti | Nentkateshet, Tirane | 0663333333 |
Po ashtu edhe kushti WHERE
mund te zgjerohet duke perdorur fusha te ndryshme me operatoret AND
dhe OR
.
DELETE
Deklarata DELETE
na jep mundesine qe te fshijme rekorde nga nje tabele e databazes. Edhe ne kete rast specifikojme nje kusht WHERE
per te percaktuar se cilat rekorde do te fshihen. Ne rast se kushti WHERE
nuk specifikohet atehere te gjitha rekordet do te fshihen, gje e cila eshte e rrezikshme dhe duhet patur kujdes.
DELETE FROM lexuesit
WHERE id = '4';
Pasi te ekzekutohet komanda e mesiperme ne tabele do te fshihet rekordi qe e ka id-ne te barabarte me 4
.
Ekzekutojme komanden SELECT
per te pare rekordet ekzistuese:
id | emri | adresa | celular |
---|---|---|---|
1 | Alban Afmeti | Qyteti Studenti, Tirane | 0662222222 |
2 | Drilon Kerxhaliu | Ali Demi, Tirane | 0662017293 |
3 | Brilant Afmeti | Rruga Kavajes, Tirane | 0662583993 |
5 | Leart Gjoni | Brryli, Tirane | 0664435948 |
6 | Gentjan Afmeti | Nentkateshet, Tirane | 0663333333 |
Rekordi qe eshte paraqitur me vizen nuk do te shfaqet ne databaze pas fshirjes:
id | emri | adresa | celular |
---|---|---|---|
1 | Alban Afmeti | Qyteti Studenti, Tirane | 0662222222 |
2 | Drilon Kerxhaliu | Ali Demi, Tirane | 0662017293 |
3 | Brilant Afmeti | Rruga Kavajes, Tirane | 0662583993 |
5 | Leart Gjoni | Brryli, Tirane | 0664435948 |
6 | Gentjan Afmeti | Nentkateshet, Tirane | 0663333333 |
Dallojme qarte qe nuk ekziston nje rekord me id = 4
.
COUNT(*)
Ne rast se duam te shikojme thjeshte sesa rekorde jane ne tabele (duke mos marre rekordet, por numrin e tyre), ne mund te perdorim COUNT(*)
. COUNT(*)
numeron te gjitha rekordet pavaresisht se cfare vlere kane ata.
SELECT COUNT(*) FROM lexuesit;
Komanda:
SELECT COUNT(*) FROM lexuesit;
count(*) |
---|
5 |
Vendosim nje alias per emrin e fushes qe do te gjenerohet nga COUNT(*)
:
Komanda:
SELECT COUNT(*) AS numri_rekordeve FROM lexuesit;
numri_rekordeve |
---|
5 |
Ne nje nga shembujt e mesiperm trajtuam rastin kur nje fushe ne tabele mund te kete edhe vleren NULL
, si ne rastin e meposhtem:
id | emri | adresa | celular |
---|---|---|---|
1 | Alban Afmeti | Qyteti Studenti, Tirane | 0662222222 |
2 | Drilon Kerxhaliu | Ali Demi, Tirane | 0662017293 |
3 | Brilant Afmeti | Rruga Kavajes, Tirane | 0662583993 |
4 | Arber Lami | Rruga Dibres, Tirane | 0662583777 |
5 | Leart Gjoni | Brryli, Tirane | 0664435948 |
6 | Gentjan Afmeti | Blloku, Tirane | (NULL) |
Ne rast se ekzekutojme komanden:
Komanda:
SELECT COUNT(*) AS numri_rekordeve FROM lexuesit;
numri_rekordeve |
---|
6 |
Do te na kthehet rezultati 6
, pasi ne te vertete ne tabele ekzistojne 6 rekorde.
Per te numeruar te gjitha rekordet qe nje kolone te caktuar nuk e kane me vlere NULL
perdorim COUNT(emri_fushes)
, ku emri_fushes
duhet te zevendesohet me emrin e kolones mbi te cilen do te behet numerimi.
Shembull:
Komanda:
SELECT COUNT(celular) AS numri_rekordeve FROM lexuesit;
numri_rekordeve |
---|
5 |
Ne kete rast u kthye rezultati 5
, pasi edhe pse ne tabele ekzistojne 6 rekorde, rekordi i fundit e ka me vlere NULL
fushen celular
, mbi te cilen u krye numerimi.
CREATE
Per te krijuar nje baze te dhenash perdorim komanden CREATE DATABASE
. P.sh. nese duam te krijojme nje baze te dhenash me emer libraria
, perdorim komanden e meposhtme:
CREATE DATABASE libraria;
Per te krijuar nje tabele perdorim komanden CREATE TABLE
.
CREATE TABLE emri_tabeles
(
kolona_1 tipi,
kolona_2 tipi,
...
);
Per te krijuar tabelen lexuesit
eshte perdorur komanda e meposhtme:
CREATE TABLE lexuesit
(
id int,
emri varchar(50),
adresa varchar(80),
celular varchar(15)
);
Per te specifikuar se cila kolone do te jete PRIMARY KEY
dhe AUTOINCREMENT
:
CREATE TABLE lexuesit
(
id int AUTO_INCREMENT,
emri varchar(50),
adresa varchar(80),
celular varchar(15),
PRIMARY KEY (id)
);
Ne disa raste nuk duam qe ndonje kolone te pranoje vleren NULL
, p.sh. fusha id
nuk duhet te jete kurre NULL
sepse eshte celesi primar. Po ashtu edhe emri i lexuesit nuk duhet te jete kurre NULL
sepse nuk do te kishte kuptim, dhe nuk do te arrinim te identifikonim se per ke lexues e ka fjalen.
CREATE TABLE lexuesit
(
id int NOT NULL AUTO_INCREMENT,
emri varchar(50) NOT NULL,
adresa varchar(80),
celular varchar(15),
PRIMARY KEY (id)
);
Ne seksionin ku kemi folur per databazat relacionale, kemi permendur konceptin e FOREIGN KEY
, celes i jashtem i nje tabele qe referencon nje tabele tjeter. P.sh. fusha id_lexues
e tabeles librat
eshte nje celes i jashtem qe per cdo rekord te tabeles librat
referencon nje rekord te tabeles lexuesit
. Nje FOREIGN KEY
mund ta krijojme si me poshte ne momentin e krijimit te nje tabele:
CREATE TABLE librat
(
id int NOT NULL AUTO_INCREMENT,
libri varchar(80) NOT NULL,
data_kthimit date,
id_lexues int,
PRIMARY KEY (id),
FOREIGN KEY (id_lexues) REFERENCES lexuesit(id)
);
Pjesa FOREIGN KEY (id_lexues) REFERENCES lexuesit(id)
tregon qe fusha id_lexues
do te jete celes i jashtem dhe referencon fushen id
te tabeles lexuesit
.
Tipet e te dhenave
Kur krijojme nje tabel, per cdo kolone na duhet te percaktojme tipin e te dhenave qe do te mbaje, si ne rastin:
CREATE TABLE lexuesit
(
id int,
emri varchar(50),
adresa varchar(80),
celular varchar(15)
);
Kemi percaktuar tipin int
per fushen id
dukeqenese do te mbaje nje numer (pa presje dhjetore). Kemi percaktuar tipin varchar
per fushen emri
sepse do te mbaje nje tekst. Numri ne kllapa qe vjen pas termit varchar
paraqet numrin maksimal te karaktereve qe do te kete fusha ne databaze.
Vec ketyre dy tipeve te dhenash, sistemet per menaxhimin e bazave te te dhenave ofrojne nje liste te gjate te tyre. Listojme me poshte nder tipet me te perdorura:
int
- Mban nje vlere numerike te plotefloat
osedouble
- Mban nje numer me presje dhjetoredate
- Mban nje date te tipitviti-muaj-dita
p.sh. 2017-02-02datetime
- Mban daten dhe oren te tipitviti-muaj-dita ore:minuta:sekonda
p.sh. 2017-02-02 07:20:25text
- Mban nje tekst te gjatevarchar
- Mban maksimumi nje tekst me madhesi aq sa e specifikojme. Ka nje limit. Per tekste shume te gjata perdorim tipintext
char
- Mban tekst deri ne 255 karaktere
Vlerat DEFAULT
Mund te na duhet qe per disa fusha te specifikojme nje vlere default
, qe ne rastin kur shtojme rekorde dhe nuk specifikojme nje vlere per fushen ne fjale, atehere ajo te marre vleren default
.
CREATE TABLE Punonjesit
(
id int NOT NULL,
emri varchar(100) NOT NULL,
qyteti varchar(100) DEFAULT 'Tirane'
)
Ne deklarimin e fushes qyteti
kemi perdorur termin DEFAULT 'Tirane'
e cila vendos nje vlere default
per kete fushe, ne rastet qe per te nuk jepet vlere nga perdoruesi (kur shtohet rekord i ri).